【Java编程系列】使用List集合对百万数据量高效快速过滤去重筛选

您所在的位置:网站首页 java 集合过滤 【Java编程系列】使用List集合对百万数据量高效快速过滤去重筛选

【Java编程系列】使用List集合对百万数据量高效快速过滤去重筛选

2023-10-08 05:39| 来源: 网络整理| 查看: 265

热门系列: 【Java编程系列】WebService的使用 【Java编程系列】在Spring MVC中使用工具类调用Service层时,Service类为null如何解决 【Java编程系列】Spring中使用代码实现动态切换主从库(多数据源) 【Java编程系列】log4j配置日志按级别分别生成日志文件 【Java编程系列】使用Java进行串口SerialPort通讯 【Java编程系列】comet4j服务器推送实现 【Java编程系列】使用JavaMail通过SMTP协议发送局域网(内网)邮件 【Java编程系列】解决Java获取前端URL中加号(+)被转换成空格的问题 【Java编程系列】Java自定义标签-Tag 【Java编程系列】Java与Mysql数据类型对应表 【Java编程系列】二进制如何表示小数?0.3+0.6为什么不等于0.9?纳尼!!!   程序人生,精彩抢先看 1.序言

前段时间,接到一个需求。需要将微信公众号的粉丝批量分组。当时需要分组的粉丝用户量达到250W左右,但通过和我们的业务数据库中筛选出来的不合格用户粉丝,需要从250W粉丝中过滤去重。不合格的粉丝数有80W条左右,也就是最终需要筛选出需要分组的粉丝数为170W左右。如此一下,两个大数据集合对比筛选就需要考虑效率问题了!

2.过程

①一开始尝试了一下双重for循环大法,那结果,酸爽无比。程序直接把CPU喂饱了。。。。如此肯定是不可取的。

②使用Iterator迭代器,通过单循,并使用list的contains方法,来筛选。代码如下:

Iterator fensiIterator = fensiList.iterator(); String temp = null; while (fensiIterator.hasNext()){ temp = fensiIterator.next().toString(); if(openIds.contains(temp)){ fensiIterator.remove(); } }

效率也很差,但比第一种稍微好一丢丢

③加强版来啦(推荐)!!!!先上代码:

//250W数据list集合转换成set集合 HashSet fensiSet = new HashSet(fensiList); //80W从数据库筛选出来不合符条件,需要过滤掉的用户list集合 HashSet removeSet = new HashSet(openIds); //去重操作 fensiSet.removeAll(removeSet); //清空原有list,并装入过滤后的数据set集合 fensiList.clear(); fensiList.addAll(fensiSet);

已经加上了注释,大家应该可以一目了然吧!

咱们来分析一下,为啥set如此之快!查贴发现,原来set的HashSet.contains()方法,底层是通过HashMap来实现的。而HashMap的查找速度是很快的。虽然list也有removeAll()方法,但是与set的removeAll()方法相比,底层实现不同,也导致效率差异明显。

 

本博客皆为学习、分享、探讨为本,欢迎各位朋友评论、点赞、收藏、关注,一起加油!

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3